package com.jvm.shk;

/**
 * @author ：qs
 * @date ：Created in 2022/7/14
 * @description：
 * @modified By：
 */
public class ThreadService {

    //执行线程
    private Thread executeThread;

    private boolean finished = false;

    public void execute(Runnable task) {
        executeThread = new Thread() {
            @Override
            public void run() {
                Thread runner = new Thread(task);
                runner.setDaemon(true);//创建一个守护线程，让守护线程来执行工作

                runner.start();
                try {
/**
 * 1、要让executeThread等守护线程执行完，才能执行executeThread自己的逻辑。不然守护线程
 * 可能就来不及执行真正的工作就死了。所以这里要join
 * 2、runner.join()，所以实际上等待的是executeThread       //pos_1
 */
                    runner.join();
                    finished = true;
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                }
            }
        };

        executeThread.start();
    }

    public void shutdown(long mills) {
        long currentTime = System.currentTimeMillis();
        // 一直循环
        while (!finished) {
            System.out.println("1111");
            if ((System.currentTimeMillis() - currentTime) >= mills) {
                System.out.println("任务超时，需要结束他!");
                /*
                 * pos_1那里，由于实际等待的是executeThread，所以这里中断executeThread。
                 * pos_1就可以捕获到中断，执行线程(executeThread)就结束了，进而真正执行任务的
                 * 守护线程runner也结束了
                 */
                executeThread.interrupt();
                break;
            }

            try {
                executeThread.sleep(1);
            } catch (InterruptedException e) {
                System.out.println("执行线程被打断!");
                break;
            }
        }

        finished = false;
    }
}
